#include <stdio.h>      // 标准输入输出
#include <fcntl.h>      // 文件控制（open, fcntl等）
#include <unistd.h>     // UNIX标准函数（read, pause等）
#include <signal.h>     // 信号相关（signal, SIGIO）

int fd; // 全局变量，文件描述符

/*
 * 异步信号处理函数
 * 当内核发送 SIGIO 信号时会被调用
 */
void sigio_handler(int signum) {
    char buf[128];

    // 从驱动读取数据（此时内核驱动写了新数据）
    read(fd, buf, sizeof(buf));

    // 打印接收到的数据
    printf("Received async data: %s\n", buf);
}

int main() {

    // 以只读+非阻塞模式打开设备
    fd = open("/dev/myfasync", O_RDONLY | O_NONBLOCK);
    if (fd < 0) {
        perror("open");  // 打开失败打印错误
        return -1;
    }

    // 设置信号处理函数
    // 当收到 SIGIO 信号时，执行 sigio_handler 函数
    signal(SIGIO, sigio_handler);

    // 告诉内核：这个文件的"属主"是当前进程，SIGIO信号发给我
    fcntl(fd, F_SETOWN, getpid());

    // 设置文件状态标志，打开异步通知（O_ASYNC）
    fcntl(fd, F_SETFL, O_ASYNC);

    printf("Waiting for async data...\n");

    // 主程序进入死循环，等待信号（SIGIO）到来
    while (1)
        pause(); // 进程挂起，直到收到信号再唤醒

    close(fd); // 关闭设备（实际上永远不会执行到这里）
    return 0;
}
